Android Tips #47 NineOldAndroids で ObjectAnimator とかを Android 3.0 以前から使う
NineOldAndroids とは
NineOldAndroids とは Android 3.0 で導入されたアニメーション用のAPIを旧バージョンでも利用できるようにするライブラリです。例の ActionbarSherlock を作っているかたが作っています。このライブラリを使うことによってバージョン間の実装の違いを埋めることができます!
まずはサンプル
まずはサンプルを動かしてみましょう。以下からライブラリ&サンプルファイルをダウンロードして解凍します。
http://nineoldandroids.com/#download
解凍したら Eclipse を起動し、メニューから File > Import... を選びます。解凍したフォルダの library フォルダと sample フォルダをそれぞれインポートしてください。
library は Android ライブラリプロジェクトになっているので、自分のアプリに組み込みたい場合はこのプロジェクトを参照します。sample はサンプルアプリの Android プロジェクトです。 library プロジェクトを参照していますが、普通にインポートしただけだとうまく参照されずエラーになりました。そこで、まず library プロジェクトをクリーンしてから sample プロジェクトをクリーンしたところエラーが解消されました。もしエラーが起きた場合はこの手順でやってみてください。
ということでまずは実行してみます。
色々なサンプルがありますね!いずれのサンプルもとってもシンプルなものなので、基本的にはこのサンプルソースを見ながら実装すれば問題なさそうです。また NineOldAndroids は Android 3.0 のアニメーション API とほぼ同じ API が実装されているようなので、Android 3.0 以降のアニメーション API を触ったことがあるかたは同じように実装できるので API を新しく学ぶ必要はありません!置き換えもパッケージを変えるだけなので楽ちんですね。
実装してみる
ということでサンプル動かしただけだとアレなので、View がスケールするアニメーションをちょっとだけ実装してみたいと思います。といっても実装はシンプルで分かりやすいです。今回は ObjectAnimator というクラスを使います。 ofFloat メソッドを呼び出して ObjectAnimator インスタンスを生成し setDuration や setRepeatCount などで細かなプロパティを設定し、最後に animate でアニメーションを実行します。以下のような感じです。
private void animate() { target = findViewById(R.id.target_view); ObjectAnimator animator = ObjectAnimator.ofFloat(target, "scaleY", 1, 2, 1); animator.setRepeatCount(ObjectAnimator.INFINITE); animator.setDuration(DURATION); animator.addListener(this); animator.start(); } @Override public void onAnimationStart(Animator animation) { Log.d(TAG, "onAnimationStart"); } @Override public void onAnimationEnd(Animator animation) { Log.d(TAG, "onAnimationEnd"); } @Override public void onAnimationCancel(Animator animation) { Log.d(TAG, "onAnimationCancel"); } @Override public void onAnimationRepeat(Animator animation) { Log.d(TAG, "onAnimationRepeat"); }
実行すると以下のように ImageView がスケールするアニメーションになります!
まとめ
以上、NineOldAndroids の簡単なご紹介でした。実装で困ることはクラスのインポートくらいでしょうか。。クラス名もすべて標準 API のクラスと同じなので、パッケージを間違えないように注意が必要です。ライセンスは Apache License 2.0 なので商用利用も可です。クラスの詳細についてはまた別の記事でご紹介したいと思います。
参考
おまけ
サンプルのリソースを少しアレンジしてみました。